// 权限拦截路由跳转   导航守卫
import router from './router'
// 引入 store 实例，和组件中的 this.$store 一回事
import store from '@/store'
// 引入进度条
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
// 不需要导出，因为 main.js 直接引入了，只需要让代码执行即可
// 前置守卫
// next 是前置守卫必须执行的钩子，next 必须执行，如果不执行，页面就死了
// next()直接执行就是 放过
// next(false) 跳转中止
// next(地址)跳转到某个地址

// 定义一个白名单，根据路由表写的
// 直接放过，不受token控制
const whiteList = ['/login', '/404']
router.beforeEach(async (to, from, next) => {
   // 导航守卫一开始就开启进度条
   nprogress.start()
   if (store.getters.token) {
      // 如果有 token
      if (to.path === '/login') {
         // 如果要访问的是登录页
         // 有token 在登录页 免登录 跳转到主页
         next('/')
      } else {
         // 如果有 token 不在登录页,直接执行
         // 判断以前是否获取过用户资料
         // 如果没有 id 才表示当前用户资料没有获取
         // 但是它是异步函数，用户资料还没有获取就放行跳转了
         // 所以没有用户资料就调用获取用户资料然后在跳转
         // 强制等待结束，async + await
         if (!store.getters.userId) {
            // 如果说是获取用户资料，在用户资料里边有要的权限的标识，有了标识就可以筛选路由
            const { roles } = await store.dispatch('user/getUserInfo')
            // 后续，需要根据用户资料获取数据，必须改成 同步,强制改
            // 筛选用户的可用路由
            // 筛选得到当前用户可用的动态路由
            // async return 的内容，用 await 就可以接收到
            // 这个 routes 就是筛选得到的动态路由
            const routes = await store.dispatch(
               'permission/filterRoutes',
               roles.menus
            )
            // console.log(routes)
            // 把动态路由添加到路由表中，默认的路由表只有静态路由，没有动态路由
            // addRoutes 添加动态路由到路由表，相当于铺路,
            // 执行完，必须用next(地址)，不能用 next()，已知的缺陷
            // 把 404 放到 最后
            router.addRoutes([
               ...routes,
               {
                  path: '*',
                  redirect: '/404',
                  hidden: true
               }
            ])
            // 添加完动态路由之后
            // 相当于跳到对应的地址，相当于多做一次跳转
            // 相当于刚进门，我要去哪决定了，我要去那个位置，路有了，就要走，路还没好
            // 如果直接走，多做一次跳转，再从门外往里进一次，跳转之前把路铺好，再次进来时
            // 路就铺好了
            // 多做一次跳转 让addRoutes 把路由表加进去，就可以跳转了
            next(to.path)
         } else {
            next()
         }
      }
   } else {
      // 没有token
      // indexOf 有值的话从 索引 0 开始，所以大于 -1
      if (whiteList.indexOf(to.path) > -1) {
         // 表示要去的地址在白名单,也就是说不需要 token
         // 直接执行
         next()
      } else {
         // 不在白名单，既没有token，也需要token，那么跳转到 登录页面
         next('/login')
      }
   }
   // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
   nprogress.done()
})
// 后置守卫
router.afterEach(() => {
   // 关闭进度条
   nprogress.done()
})
